UIApplication tips -给新手的笔记

UIApplication 对象是应用程序的象征

每一个应用程序都有自己的 UIApplication对象,而且是单例的.
通过 [UIApplication sharedApplication]可以获得这个单例对象
一个iOS程序启动后创建的第一个对象就是 UIApplication 对象
一个iOS程序启动后创建的第一个对象就是 UIApplication 对象
利用 UIApplication 对象,能进行一些应用级别的操作

验证单例操作:

1
2
3
4
5
6
7
8
9
10
- (void)viewDidLoad {
[super viewDidLoad];

UIApplication *app = [UIApplication sharedApplication];
UIApplication *app2 = [UIApplication sharedApplication];
UIApplication *app3 = [[UIApplication alloc] init];

NSLog(@"%p,%p,%p",app,app2,app3);

}

运行项目结果报错:

1
2015-04-13 19:05:19.695 forBlogTest[1897:80612] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'

错误信息很明确: 只能有一个 UIApplication 实例.

现在,我们改动一下程序

1
2
3
4
5
6
7
8
9
- (void)viewDidLoad {
[super viewDidLoad];

UIApplication *app = [UIApplication sharedApplication];
UIApplication *app2 = [UIApplication sharedApplication];

NSLog(@"%p,%p",app,app2);

}

控制台打印:

1
0x7f8453d13b80,0x7f8453d13b80

可以看到,地址是一样的.

利用 UIApplication 做应用级别的常见操作

1. 图标右上角的数字

应用程序角标
如图,这个右上角的数字是可以通过代码控制的.最常见的是在推送的处理上.

1
2
3
UIApplication *app = [UIApplication sharedApplication];
//0 代表清除图标右上角的数字
app.applicationIconBadgeNumber = 0 ;

因为 Application 是程序级别的单例对象,所以,任何地方执行这段代码均可清除角标.

2.设置显示联网状态

通过一下代码即可让状态栏显示 “菊花”

1
app.networkActivityIndicatorVisible = YES;

效果如图:
联网状态

3.打开 URL

  • URL 一个资源的唯一路径
  • URL 的组成 : 协议头://主机域名/路径
  • 网络资源 URL 的组成: http://主机域名/路径 例如 http://www.baidu.com/image/1.png
  • 本地资源 URL 的组成: file:///路径 因为是本地主机域名可以不写,但/ 不能省略. 例如file:///User/apple/desktop/2.png

UIApplication对象的 openURL 可以依靠协议头,打开各种需要的程序 .比如,下面的代码将会调用 Safari 打开网址

1
[app openURL:[NSURL URLWithString:@"http://wwww.baidu.com"]];

如果是图片等,会自动调用相应的程序,上面的代码我们写的是 http ,所以会调用 Safari.
而下面的代码将会调用电话功能

[app openURL:[NSURL URLWithString:@"tel://10086"]];

openURL 功能是非常强大的,以下简单列举一下常用的方法

  • 打电话

[app openURL:[NSURLURLWithString:@"tel://10086"]];

  • 发短信

[app openURL:[NSURLURLWithString:@"sms://10086"]];

  • 发邮件

[app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];

  • 打开网页资源

[app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];

  • 打开其他 App 根据协议头,系统进行调用

4 管理状态栏

从iOS7开始,系统提供了2种管理状态栏的方式

a.通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏).

在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式

状态栏的样式 
  

1
- (UIStatusBarStyle)preferredStatusBarStyle;

状态栏的可见性  

1
-(BOOL)prefersStatusBarHidden;

详细代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma mark-设置状态栏的样式
-(UIStatusBarStyle)preferredStatusBarStyle
{
//设置为白色
//return UIStatusBarStyleLightContent;
//默认为黑色
return UIStatusBarStyleDefault;
}
#pragma mark-设置状态栏是否隐藏(否)
-(BOOL)prefersStatusBarHidden
{
return NO;
}
b.通过UIApplication管理(一个应用程序的状态栏都由它统一管理)

如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置
在 info.plist文件中,添加一个:
View controller-based status bar appearance 值为 NO
这样,就是不让控制器管理 statusbar

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//通过sharedApplication获取该程序的UIApplication对象
UIApplication *app=[UIApplication sharedApplication];
app.applicationIconBadgeNumber=123;

//设置指示器的联网动画
app.networkActivityIndicatorVisible=YES;
//设置状态栏的样式
//app.statusBarStyle=UIStatusBarStyleDefault;//默认(黑色)
//设置为白色+动画效果
[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
//设置状态栏是否隐藏
app.statusBarHidden=YES;
//设置状态栏是否隐藏+动画效果
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

既然两种都可以对状态栏进行管理,那么什么时候该用什么呢?
如果状态栏的样式只设置一次,那就用UIApplication来进行管理;
如果状态栏是否隐藏,样式不一样那就用控制器进行管理。
UIApplication来进行管理有额外的好处,可以提供动画效果。